home *** CD-ROM | disk | FTP | other *** search
-
-
-
- program splitter;
-
- {
- ***** Quickhack, um eine große Datei in mehrere kleine *****
-
- ***** aufzuspalten. (C) 1993 by B. Künnen *****
- }
-
- {$I "Include:libraries/dos.i" }
- {$I "Include:utils/stringlib.i" }
- {$I "Include:exec/memory.i" }
-
- Const
- bufsize = 64*1024; { Größe des IO-Puffers }
-
- VAR
- ok : Boolean;
- mymem : Address;
- inFile : String;
- i,
- num_files : Integer;
- len : Array[1..10] of Integer;
- inhdl,
- outhdl : FileHandle;
-
-
- Procedure CleanExit(why : String; rt : Integer);
- Begin
- If inhdl <> NIL then DosClose( inhdl );
- If outhdl <> NIL then DosClose( outhdl );
- If mymem <> NIL then FreeMem( mymem, bufsize );
-
- If why <> NIL then write(why);
- Exit(rt);
- End;
-
-
- { Einlesen & Ausgabe der Daten }
-
- Function SplitIO( num : Integer ): Boolean;
- Var
- r,w,
- rwlen,
- outlen : Integer;
- buffer : array[0..100] of Char;
- NewName : String;
- buflen : integer;
-
- Begin
- NewName := Adr( buffer );
- strcpy( NewName, inFile );
-
- { Name der Ausgabedatei = Eingabedatei+Nummer }
- buflen := strlen( NewName );
- NewName[buflen] := chr( Byte('0') + num );
- NewName[buflen+1] := chr(0);
-
- { Öffnen }
- outhdl := DosOpen( NewName, Mode_NewFile );
- If outhdl=NIL then SplitIO:=FALSE;
-
- { Länge dieser neuen Datei }
- Write("Länge der ", num, ". Datei : ");
- readln(outlen);
- write("Moment...\n");
-
- { Jetzt in bufsize -großen Stücken umschaufeln }
- REPEAT
- if outlen>bufsize then
- rwlen := bufsize
- else
- rwlen := outlen;
-
- r := DosRead ( inhdl, mymem, rwlen );
- w := DosWrite( outhdl, mymem, r );
-
- If r < rwlen then begin
- write("Dateiende erreicht - Programmabbruch\n");
- DosClose(outhdl);
- outhdl := NIL;
- SplitIO := FALSE;
- End;
-
- If w < r then begin
- Write("Fehler bei der Ausgabe in die Ziel Datei ", NewName, "\n" );
- DosClose( outhdl );
- SplitIO := FALSE;
- End;
-
- If outlen > bufsize then
- outlen := outlen-bufsize
- else
- outlen := 0;
-
- UNTIL outlen=0;
-
- { Uuuuuuuuuuuuuuuuuuuuuuuuuuuuunnnd ..... tschüß ! }
- DosClose( outhdl );
- SplitIO := TRUE;
- End;
-
-
-
- { ---- Hauptschleife ---- }
-
- Begin
- inFile := AllocString(100);
-
- write("Welche Datei soll zerlegt werden ? : ");
- Readln(inFile);
- If inFile^=chr(0) then CleanExit("Kein Dateiname angegeben.\n", 0);
-
-
- inhdl := DosOpen( inFile, Mode_OldFile );
- If inhdl=NIL then CleanExit("Kann Datei nicht öffnen.\n", 10);
-
-
- mymem := AllocMem( bufsize, Memf_Public );
- If mymem = NIL then CleanExit("Zu wenig Speicher", 20);
-
-
- write("In wieviele Einzeldateien soll sie zerlegt werden ? : ");
- Readln(num_files);
- If (num_files>10) OR (num_files<1)
- then CleanExit("Min.1 & max. 10 Split-Dateien erlaubt.\n", 0);
-
- { Jetzt gehts los ... }
-
- for i := 1 to num_files do begin
- ok := SplitIO( i );
- If OK = False then CleanExit(NIL,0);
- end;
-
- CleanExit(NIL,0);
- End.
-
-
-
-
-